# 在生产者进程中我们将数据放入队列，然后在消费者进程中我们从队列中获取数据，然后输出，
# 这样就实现了进程间通信。注意这里的队列使用的是 multiprocessing 模块提供的 Queue 类
# 这个queue是进程安全的，可以在多个进程之间共享数据
# queue 是基于Pipe实现的,性能比 Pipe 差
# 但是 Queue 多个进程可以共享的，而 Pipe 是两个进程之间共享的

from multiprocessing import Process, Queue, Pool, cpu_count
import os, time, random


def write(q):
    print('Process to write: %s' % os.getpid())
    for value in range(0,30):
        print(f'Put {value} to queue...')
        q.put(value)  # 将数据放入队列
        time.sleep(random.random())  # 随机休眠


def read(q):
    print('Process to read: %s' % os.getpid())
    while True:
        value = q.get(True)  # 从队列中获取数据
        print(f'Get {value} from queue...')


if __name__ == '__main__':
    queue = Queue()  # 创建一个队列
    
    pwriter = Process(target=write, args=(queue,))  # 创建一个生产者进程
    preader = Process(target=read, args=(queue,))  # 创建一个消费者进程
    pwriter.start()
    preader.start()  
    pwriter.join()
    preader.terminate()  # 强制终止消费者进程, 它本身是一直执行read的死循环,main等不到其推出